﻿; (function ($) {
    /**
    * 依赖jquery-1.4.2
    * 依赖jquery.json-2.2，参考http://code.google.com/p/jquery-json/
    * 用于将form序列化成json串，并且可以反序列化填充回来
    */
    $.fn.serializeObjectToJson = function () {
        /**
        * 此方法代码参考：http://css-tricks.com/snippets/jquery/serialize-form-to-json/
        */
        var o = {};
        var a = this.serializeArray();
        $.each(a, function () {
            if (o[this.name]) {
                if (!o[this.name].push) {
                    o[this.name] = [o[this.name]];
                }
                o[this.name].push(this.value || '');
            } else {
                o[this.name] = this.value || '';
            }
        });
        return o;
        // return $.toJSON(o);
    }; 
    /*** 按json格式添充现有form,基中json的key对应form内的元素name
    * 支持input、radio、select、textarea单值或多值
    * 参数json为json对象
    */
    $.fn.unSerializeObjectFromJson = function (json) {
        if (!json) return;
        var values = eval('(' + json + ')');
        var form = this;
        /**
        * 得到现有form表单的内容，如果表单有默认值则全部清空，主要针对单值表单项，如：checkbox、radio，因为这些项如果不选中会不被序列化记录暂存，所以
        * 在反序列化时，无法处理可能存在默认值的这些表单项，所以这里做一下特殊处理
        */
        var defaultFormJsonValues = form.serializeObjectToJson();
        $.each(defaultFormJsonValues, function (key, value) {
            var object = form.find("*[name='" + key + "']");
            if (object.length == 1) {
                if (object.attr("type").toLowerCase() == 'radio' || object.attr("type").toLowerCase() == 'checkbox') {
                    object.attr("checked", false);
                }
            }
        });
        //加载需要添充的表单内容
        $.each(values, function (key, value) {
            var object = form.find("*[name='" + key + "']"); //得到form内指定name的控件
            if (object.length == 1) {
                if (object.attr("type").toLowerCase() == 'radio' || object.attr("type").toLowerCase() == 'checkbox') {
                    if (object.val() == value) {
                        object.attr("checked", true);
                    }
                    return true;
                } else {
                    object.val(value);
                }
            } else if (object.length > 1) {
                object.each(function (i) {
                    if (object.attr("type").toLowerCase() == 'radio' || object.attr("type").toLowerCase() == 'checkbox') {
                        if ($.inArray($(this).val(), value) != -1) {
                            $(this).attr("checked", true);
                        } else {
                            $(this).attr("checked", false);
                        }
                    } else {
                        $(this).val(value[i]);
                    }
                });
            }
        });
    }; 
    /*** 得到当前年的第一天*/
    $.getCurrentYearFirstDay = function (format) {
        var date = new Date();
        var fDate = new Date(date.getFullYear(), 0, 1, 0, 0, 0, 0);
        return $.getFormateDate(format, fDate);
    }; 
    /*** 得到当前年的最后一天*/
    $.getCurrentYearLastDay = function (format) {
        var date = new Date();
        var fDate = new Date(date.getFullYear(), 11, 31, 23, 59, 59, 999);
        return $.getFormateDate(format, fDate);
    }; 
    /*** 得到当前月的第一天*/
    $.getCurrentMonthFirstDay = function (format) {
        var date = new Date();
        var fDate = new Date(date.getFullYear(), date.getMonth(), 1, 0, 0, 0, 0);
        return $.getFormateDate(format, fDate);
    }; 
    /*** 得到当前月的最后一天*/
    $.getCurrentMonthLastDay = function (format) {
        var date = new Date();
        var fDate = new Date(date.getFullYear(), date.getMonth() + 1, 0, 23, 59, 59, 999);
        return $.getFormateDate(format, fDate);
    }; 
    /*** 格式化日期*/
    $.getFormateDate = function (fmt, date) {
        if (!date) date = new Date();
        var o = {
            "M+": date.getMonth() + 1, //月份 
            "d+": date.getDate(), //日 
            "h+": date.getHours() % 12 == 0 ? 12 : date.getHours() % 12, //小时
            "H+": date.getHours(), //小时
            "m+": date.getMinutes(), //分
            "s+": date.getSeconds(), //秒
            "q+": Math.floor((date.getMonth() + 3) / 3), //季度
            "S": date.getMilliseconds() //毫秒
        };
        var week = {
            "0": "\u65e5",
            "1": "\u4e00",
            "2": "\u4e8c",
            "3": "\u4e09",
            "4": "\u56db",
            "5": "\u4e94",
            "6": "\u516d"
        };
        if (/(y+)/.test(fmt)) {
            fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
        }
        if (/(E+)/.test(fmt)) {
            fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? "\u661f\u671f" : "\u5468") : "") + week[date.getDay() + ""]);
        }
        for (var k in o) {
            if (new RegExp("(" + k + ")").test(fmt)) {
                fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
            }
        }
        return fmt;
    };
})(jQuery);